/*
 * common.h
 *
 * Created on: $(date:yyyy-MM-dd)
 * Author: $(user)
 */

#ifndef common_H
#define common_H

#include <iostream>
#include <cstring>        // 提供memset()函数
#include <cstdlib>        // 提供EXIT_FAILURE和exit()函
#include <string>
#include <system_error>
#include <sys/socket.h>   // 提供socket相关函数和结构
#include <arpa/inet.h>    // 提供inet_addr()等网络地址转换函数
#include <unistd.h>       // 提供close()等Unix标准函数
#include <net/if.h>
#include <sys/ioctl.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include <fcntl.h>
#include <termios.h>
#include <cstdio>
#include <thread>
#include <functional>
#include <future>
#include <utility>
#include <atomic>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <cmath>
#include <chrono>

#include <fstream>
#include <signal.h>

#include "json.hpp"


#define PORT 50020
#define BUFFER_SIZE 75
#define PI 3.14159265358979323846

#define Propeller_LR_Max 170
#define Propeller_LR_Min -170

#define Propeller_UD_Max 250
#define Propeller_UD_Min -150

#define Propeller_Go_Max 250
#define Propeller_Go_Min -150

#define INTERVAL 0.5

using namespace std;


/**
 * @brief 推进器的参数
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-07-10
*/
class Propeller{
    public:
    int mode;   //方向
    int angle;  //数值大小
};

/**
 * @brief 惯导的参数结构体
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-07-10
*/
class Aipov_Data {
public:
    float utc_time; // UTC时间 *
    float heading; // 航向 *
    float roll; // 横滚 /
    float pitch; // 俯仰 *
    float angular_velocity_x; // 载体角速度X轴 
    float angular_velocity_y; // 载体角速度Y轴 
    float angular_velocity_z; // 载体角速度Z轴 
    float acceleration_x; // 载体加速度X轴
    float acceleration_y; // 载体加速度Y轴
    float acceleration_z; // 载体加速度Z轴
    float latitude; // 纬度 *
    float longitude; // 经度 *
    float altitude; // 高度 
    float velocity_east; // 东向速度
    float velocity_north; // 北向速度
    float velocity_up; // 天向速度
    float velocity; // 速度 *
    float non;
    unsigned long hex1;
    unsigned long hex2;
};

/**
 * @brief 电池的参数
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-07-10
*/
class Battery_data{
public:
    float v;
    float I;
    float soc; // 电量 *
};

/**
 * @brief 高度计与深度计的参数
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-07-10
*/
class Depth_data{
public:
    float depth;        //深度 *
    float pressure;     //压力 
    float temperature;  //温度
    int checksum;       //校验码
};

/**
 * @brief 设置串口参数的函数
 * @param  fd
 * @param  speed
 * @param  bits
 * @param  check
 * @param  stop
 * @return int 
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-07-28
*/
int set_uart(int fd, int speed, int bits, char check, int stop);

/**
 * @brief 
 * @param  message
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-07-28
*/
void handleMessage(const string& message);

/**
 * @brief 将字符串转换成可以直接向上发送的信息
 * @param  buf
 * @param  buffer
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-07-28
*/
void format(char *buf,char *buffer);

/**
 * @brief 计算两点的夹角
 * @param  start_x
 * @param  start_y
 * @param  end_x
 * @param  end_y
 * @return double 
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-07-21
*/
double calculate_angle(double start_x, double start_y, double end_x, double end_y);
/**
 * @brief 计算两点的距离
 * @param  x1
 * @param  y1
 * @param  x2
 * @param  y2
 * @return double 
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-07-21
*/
double calculate_distance(double x1, double y1, double x2, double y2);

/**
 * @brief 序列化单个数据项
 * @param  dest
 * @param  src
 * @param  size
 * @param  offset 偏移量
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-07-23
*/
void serialize_item(void *dest, const void *src, size_t size, int *offset);

/**
 * @brief 二次保护 尾推输入值
 * @param  out
 * @param  max 最大值
 * @param  min 最小值
 * @return int out
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-07-25
*/
int Limit_Size(int out, int max, int min);

/**
 * @brief Get the Current Time object
 * @return string 
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-08-19
*/
string getCurrentTime();

/**
 * @brief 写入CSV文件
 * @param  filename
 * @param  data
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-08-19
*/
void writeCSV(const string& filename, const vector<vector<string>>& data);
/**
 * @brief 记录数据
 * @return int 
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-08-19
*/
// int recordData();

/**
 * @brief 打印can报文
 * @param  data
 * @param  n
 * @author Dongcj (1217365417@qq.com)
 * @date 2025-08-31
*/
void print_resp(unsigned char *data, int n);

// 设定全局变量
extern Aipov_Data aipov_data;
extern Battery_data battery_data;
extern Depth_data depth_data;
extern Propeller propeller;
extern float height; // *
extern nlohmann::json j;
extern string filename;
#endif // common_H